TreeviewCopyright © aleen42 all right reserved, powered by aleen42
Dart 的 IO
库中提供了处理 HTTP 的一些类,使用起来也十分简单。
因为是 Dart 自带的,所以无需额外引入其他包,可以直接使用。
创建 HttpClient 对象
HttpClient client = HttpClient();
创建好 Client,就可以调用一系列方法了,get
、post
、delete
、put
等方法发起请求了。
HttpClient
有很多属性可以配置,常用的属性列表如下:
- idleTimeout,对应请求头中的
keep-alive
字段值,为了避免频繁建立连接,httpClient
在请求结束后会保持连接一段时间,超过这个阈值后才会关闭连接。 - connectionTimeout,和服务器建立连接的超时,如果超过这个值则会抛出
SocketException
异常。 - maxConnectionsPerHost,同一个 host,同时允许建立连接的最大数量。
- autoUncompress,对应请求头中的
Content-Encoding
,如果设置为true
,则请求头中Content-Encoding
的值为当前HttpClient
支持的压缩算法列表,目前只有gzip
- userAgent,对应请求头中的
User-Agent
字段。
这些属性都可以在请求中通过消息头直接设置,区别在于,为 HttpClient 设置对整个 HttpClient 生效,而在请求中设置,只对该请求生效。
get 请求
HttpClient 提供了两个方法来帮助我们完成 get 请求:
get
Future<HttpClientRequest> get(String host, int port, String path)
参数很简单,分别是主机端口和路径。
HttpClientRequest request = await client.get("www.baidu.com", 80, "");
getUrl
Future<HttpClientRequest> getUrl(Uri url);
例子:
HttpClientRequest request = await client.getUrl(Uri.parse("www.baidu.com"));
如果请求包含参数,则可以通过 Uri 来构建:
Uri uri=Uri(scheme: "https", host: "flutterchina.club", queryParameters: { "xx":"xx", "yy":"dd" });
上面两个方法都可以获取到 HttpClientRequest
对象,然后我们就可以为这个请求设置请求头:
request.headers.add(HttpHeaders.contentTypeHeader, "text/plain");
设置妥当之后,调用 HttpClientRequest
的 close
方法,该方法会关闭请求,这一步完成后,请求信息就已经发送给服务器了,返回一个HttpClientResponse
对象,它包含响应头(header)和响应流(响应体的Stream),接下来就可以通过读取响应流来获取响应内容。
HttpClientResponse response = await request.close();
获得了响应 HttpClientResponse
对象之后,就可以读取响应体了:
String responseBody = await response.transform(utf8.decoder).join();
我们通过读取响应流来获取服务器返回的数据,在读取时我们可以设置编码格式,这里是 utf8
。
请求结束之后,就可以关闭 Client 了:
client.close();
get 请求示例
HttpClient client = HttpClient();
HttpClientRequest request = await client.get("www.baidu.com", 80, "");
HttpClientResponse response = await request.close();
if (response.statusCode == 200) {
String responseBody = await response.transform(utf8.decoder).join();
print(responseBody);
}
post 请求
和 get 请求的区别在于,在获取到 HttpClientRequest 对象之后,可以通过 request 来发送请求体:
String string="...";
request.add(utf8.encode(string));
//request.addStream(_inputStream); //可以直接添加输入流